//
//  TimerScrollViewController.m
//  BlockTest
//
//  Created by 崔宝印 on 2017/12/13.
//  Copyright © 2017年 Koolearn. All rights reserved.
//

#import "TimerScrollViewController.h"

@interface TimerScrollViewController ()<UITableViewDataSource,UITableViewDelegate>

@property (assign, nonatomic) int timerInterval;
@property (weak, nonatomic) IBOutlet UILabel *timerLabel;

@property (strong, nonatomic) NSTimer *myTimer;//strong，weak都无所谓，[NSTimer invalidate]不执行，timer不会释放，会一直强引用其target(self)

@end

@implementation TimerScrollViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.timerInterval = 10;
    
    //1:Timer强引用target(self),只有invalidate后，才会去除对self的强引用；self pop后如果timer没有invalidate，self不会dealloc
    //2:当ScrollView滚动时，timer的repeat会暂停;
    //   NSTimer在创建后被默认添加在主线程的RunLoop的NSDefaultRunLoopMode模式上；
    //  当滑动一个ScrollView时，主线程的RunLoopRunLoop 会将 mode 切换为 TrackingRunLoopMode，
    //  这时 Timer 就不会被回调，并且也不会影响到滑动操作。此时NSTimer就会不准确。
    __weak typeof(self) weakSelf = self;//测试Timer的强引用，实际无效果
    self.myTimer =  [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(timerRepeat) userInfo:nil repeats:YES];
    
//    //block里面也无需使用weakself， timer invalidate后会释放引用
//    if (@available(iOS 10.0, *)) {
//        self.myTimer =  [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
//            [self timerRepeat];
//        }];
//    } else {
//    }
    
    //不把timer添加到RunLoop的NSDefaultRunLoopMode，解决ScrollView滚动影响
    [[NSRunLoop currentRunLoop] addTimer:self.myTimer forMode:NSRunLoopCommonModes];
}

- (void)dealloc
{
    NSLog(@"%s",__func__);
}

- (void)timerRepeat
{
    self.timerInterval--;
}

#pragma mark - Setter
- (void)setTimerInterval:(int)timerInterval
{
    _timerInterval = timerInterval;
    self.timerLabel.text = [NSString stringWithFormat:@"Timer:%d",_timerInterval];
    if (_timerInterval == 0)
    {
        [self.myTimer invalidate];//执行invalidate后，去除对self的强引用，self才会被释放
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"!!!!%@",self.myTimer);
        });
    }
}

#pragma mark- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellTag = @"TimerCellTag";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellTag];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellTag];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"cell:%d",(int)indexPath.row];
    return cell;
}
@end
